/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO.MySQL;

import Biblioteca.VerificacaoErros;
import ClassesUnicas.Pessoa;
import DAO.DAOPessoa;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.Types;
import java.util.ArrayList;
import javax.swing.JOptionPane;

/**
 *
 * @author Igor Bastos
 */
public class DAOPessoaMySQL  extends DAOConexaoMySQL implements DAOPessoa {
    //Outros metodos
    @Override
    public long gravaPessoa(Pessoa pessoa) {
        long vReturn = -1;
        try {
            CallableStatement cs;
            cs = this.con.getCon().prepareCall("{? = call GRAVA_PESSOA(?,?)}");

            cs.registerOutParameter(1, Types.DECIMAL);
            cs.setLong(2, pessoa.getIdPessoa());
            cs.setString(3, pessoa.getNome());
            cs.execute();
            vReturn = cs.getLong(1);

            this.con.getStm().executeBatch();

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, VerificacaoErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
        return vReturn;
    }

    @Override
    public ArrayList<Pessoa> buscaPessoas() {
        ResultSet result = null;
        ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>();
        Pessoa pessoa;
        int i = 0;
        try {
            result = this.select.executeQuery("select\n"
                    + "a.ID_PESSOA,\n"
                    + "a.NOME,\n"
                    + "count(b.ID_PESSOA) as JOGOS\n"
                    + "from pessoa a\n"
                    + "left outer join jogo b\n"
                    + "on a.ID_PESSOA = b.ID_PESSOA\n"
                    + "group by a.ID_PESSOA,\n"
                    + "a.NOME");

            while (result.next()) {
                pessoa = new Pessoa();

                pessoa.setIdPessoa(result.getLong("ID_PESSOA"));
                pessoa.setNome(result.getString("NOME"));
                pessoa.setQuantidadeJogos(result.getInt("JOGOS"));

                pessoas.add(pessoa);
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, VerificacaoErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
        return pessoas;
    }

    @Override
    public Pessoa buscaPessoa(long idPessoa) {
        ResultSet result = null;
        Pessoa pessoa = null;
        int i = 0;
        try {
            result = this.select.executeQuery("select\n"
                    + "a.ID_PESSOA,\n"
                    + "a.NOME\n"
                    + "from pessoa a\n"
                    + "where a.ID_PESSOA = " + idPessoa);

            while (result.next()) {
                pessoa = new Pessoa();

                pessoa.setIdPessoa(result.getLong("ID_PESSOA"));
                pessoa.setNome(result.getString("NOME"));

            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, VerificacaoErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
        return pessoa;
    }

    @Override
    public Pessoa buscaPessoa(String nome) {
        ResultSet result = null;
        Pessoa pessoa = null;
        int i = 0;
        try {
            result = this.select.executeQuery("select\n"
                    + "a.ID_PESSOA,\n"
                    + "a.NOME\n"
                    + "from pessoa a\n"
                    + "where a.NOME = " + nome);

            while (result.next()) {
                pessoa = new Pessoa();

                pessoa.setIdPessoa(result.getLong("ID_PESSOA"));
                pessoa.setNome(result.getString("NOME"));

            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, VerificacaoErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
        return pessoa;
    }

    @Override
    public long buscaPontuacaoMaxUltimoJogo(long idPessoa) {
        long pontuacao = 0;
        ResultSet result = null;
        try {
            result = this.select.executeQuery("select max(PERC_ACERTO) as PERC_ACERTO_MAX from (\n"
                    + "select distinct (select count(*) from imagem_sub_fase z where z.ID_INSTANCIA_SUB_FASE = b.ID_INSTANCIA_SUB_FASE  and z.ACERTOU_RESPOSTA = 1)\n"
                    + "*100/ count(c.ID_INSTANCIA_SUB_FASE) as PERC_ACERTO from\n"
                    + "	(select a.ID_INSTANCIA_JOGO \n"
                    + "	from instancia_jogo a join jogo b on a.ID_INSTANCIA_JOGO = b.ID_INSTANCIA_JOGO \n"
                    + "	where b.ID_PESSOA = " + idPessoa + " order by a.DATA_INICIO desc limit 0,1) as a\n"
                    + "join instancia_sub_fase b\n"
                    + "on b.ID_INSTANCIA_JOGO = a.ID_INSTANCIA_JOGO\n"
                    + "join imagem_sub_fase c\n"
                    + "on b.ID_INSTANCIA_SUB_FASE = c.ID_INSTANCIA_SUB_FASE\n"
                    + "group by b.ID_INSTANCIA_SUB_FASE\n"
                    + ") as myalias"
            );

            while (result.next()) {
                pontuacao = result.getLong("PERC_ACERTO_MAX");
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, VerificacaoErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
        return pontuacao;
    }

}
